GtkStack: Save last visible widget size
authorTimm Bäder <mail@baedert.org>
Sun, 24 May 2015 14:55:34 +0000 (16:55 +0200)
committerTimm Bäder <mail@baedert.org>
Fri, 29 May 2015 15:37:04 +0000 (17:37 +0200)
When interpolating the stack size, we compute the current size by using
the prefered/minimum current size and the last size. We can't use the
last_visible_surface_allocation because that is not available until the
first _draw call and it doesn't include the child's margins.

gtk/gtkstack.c

index 46a8f73081b3674afb7c94a91fe3496c5fc1a1b3..49a9a7cff05c590ca5b917bc824646312f81551c 100644 (file)
@@ -137,6 +137,9 @@ typedef struct {
   gint64 start_time;
   gint64 end_time;
 
+  gint last_visible_widget_width;
+  gint last_visible_widget_height;
+
   GtkStackTransitionType active_transition_type;
 } GtkStackPrivate;
 
@@ -1059,9 +1062,20 @@ set_visible_child (GtkStack               *stack,
   if (priv->visible_child && priv->visible_child->widget)
     {
       if (gtk_widget_is_visible (widget))
-        priv->last_visible_child = priv->visible_child;
+        {
+          int fake;
+          priv->last_visible_child = priv->visible_child;
+          gtk_widget_get_preferred_width (priv->last_visible_child->widget,
+                                          &fake,
+                                          &priv->last_visible_widget_width);
+          gtk_widget_get_preferred_height (priv->last_visible_child->widget,
+                                          &fake,
+                                          &priv->last_visible_widget_height);
+        }
       else
-        gtk_widget_set_child_visible (priv->visible_child->widget, FALSE);
+        {
+          gtk_widget_set_child_visible (priv->visible_child->widget, FALSE);
+        }
     }
 
   priv->visible_child = child_info;